home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / misc_pto / mwpetz16 / filedlg.c next >
C/C++ Source or Header  |  1991-06-03  |  9KB  |  295 lines

  1. /* FILEDLG.C -- Open and Close File Dialog Boxes */
  2.  
  3. #ifdef MEWEL
  4. #include <window.h>
  5. static char *nstrchr (char *, int);
  6. static char *nstrrchr (char *, int);
  7. #undef NULL
  8. #define NULL 0
  9. #else
  10. #include <windows.h>
  11. #include <string.h>
  12. #endif
  13.  
  14. #include "filedlg.h"
  15.  
  16. BOOL FAR PASCAL FileOpenDlgProc (HWND, unsigned, WORD, LONG) ;
  17. BOOL FAR PASCAL FileSaveDlgProc (HWND, unsigned, WORD, LONG) ;
  18.  
  19. static char      szDefExt   [5]  ;
  20. static char      szFileName [96] ;
  21. static char      szFileSpec [16] ;
  22. static POFSTRUCT pof ;
  23. static WORD      wFileAttr, wStatus ;
  24.  
  25. int DoFileOpenDlg (hInst, hWnd, szFileSpecIn, szDefExtIn, wFileAttrIn,
  26.                                 szFileNameOut, pofIn)
  27.      HANDLE    hInst ;
  28.      HWND      hWnd ;
  29.      char      *szFileSpecIn, *szDefExtIn, *szFileNameOut ;
  30.      WORD      wFileAttrIn ;
  31.      POFSTRUCT pofIn ;
  32.      {
  33.      FARPROC   lpfnFileOpenDlgProc ;
  34.      int       iReturn ;
  35.  
  36.      strcpy (szFileSpec, szFileSpecIn) ;
  37.      strcpy (szDefExt,   szDefExtIn) ;
  38.      wFileAttr = wFileAttrIn ;
  39.      pof = pofIn ;
  40.  
  41.      lpfnFileOpenDlgProc = MakeProcInstance (FileOpenDlgProc, hInst) ;
  42.  
  43.      iReturn = DialogBox (hInst, "FileOpen", hWnd, lpfnFileOpenDlgProc) ;
  44.  
  45.      FreeProcInstance (lpfnFileOpenDlgProc) ;
  46.  
  47.      strcpy (szFileNameOut, szFileName) ;
  48.      return iReturn ;
  49.      }
  50.  
  51. int DoFileSaveDlg (hInst, hWnd, szFileSpecIn, szDefExtIn, pwStatusOut,
  52.                                 szFileNameOut, pofIn)
  53.      HANDLE    hInst ;
  54.      HWND      hWnd ;
  55.      char      *szFileSpecIn, *szDefExtIn, *szFileNameOut ;
  56.      WORD      *pwStatusOut ;
  57.      POFSTRUCT pofIn ;
  58.      {
  59.      FARPROC   lpfnFileSaveDlgProc ;
  60.      int       iReturn ;
  61.  
  62.      strcpy (szFileSpec, szFileSpecIn) ;
  63.      strcpy (szDefExt,   szDefExtIn) ;
  64.      pof = pofIn ;
  65.  
  66.      lpfnFileSaveDlgProc = MakeProcInstance (FileSaveDlgProc, hInst) ;
  67.  
  68.      iReturn = DialogBox (hInst, "FileSave", hWnd, lpfnFileSaveDlgProc) ;
  69.  
  70.      FreeProcInstance (lpfnFileSaveDlgProc) ;
  71.  
  72.      strcpy (szFileNameOut, szFileName) ;
  73.      *pwStatusOut = wStatus ;
  74.      return iReturn ;
  75.      }
  76.  
  77. BOOL FAR PASCAL FileOpenDlgProc (hDlg, iMessage, wParam, lParam)
  78.      HWND      hDlg ;
  79.      unsigned  iMessage ;
  80.      WORD      wParam ;
  81.      LONG      lParam ;
  82.      {
  83.      char      cLastChar ;
  84.      short     nEditLen ;
  85.  
  86.      switch (iMessage)
  87.         {
  88.         case WM_INITDIALOG:
  89.            SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L) ;
  90.            DlgDirList (hDlg, szFileSpec, IDD_FLIST, IDD_FPATH, wFileAttr) ;
  91.            SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  92.            return TRUE ;
  93.  
  94.         case WM_COMMAND:
  95.  
  96.            switch (wParam)
  97.               {
  98.               case IDD_FLIST:
  99.  
  100.                  switch (HIWORD (lParam))
  101.                     {
  102.                     case LBN_SELCHANGE:
  103.                        if (DlgDirSelect (hDlg, szFileName, IDD_FLIST))
  104.                           strcat (szFileName, szFileSpec) ;
  105.                        SetDlgItemText (hDlg, IDD_FNAME, szFileName) ;
  106.                        break ;
  107.  
  108.                     case LBN_DBLCLK:
  109.                        if (DlgDirSelect (hDlg, szFileName, IDD_FLIST))
  110.                           {
  111.                           strcat (szFileName, szFileSpec) ;
  112.                           DlgDirList (hDlg, szFileName, IDD_FLIST, IDD_FPATH,
  113.                                                               wFileAttr) ;
  114.                           SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  115.                           }
  116.                        else
  117.                           {
  118.                           SetDlgItemText (hDlg, IDD_FNAME, szFileName) ;
  119.                           SendMessage (hDlg, WM_COMMAND, IDOK, 0L) ;
  120.                           }
  121.                        break ;
  122.                     }
  123.                  break ;
  124.  
  125.               case IDD_FNAME:
  126.                  if (HIWORD (lParam) == EN_CHANGE)
  127.                     EnableWindow (GetDlgItem (hDlg, IDOK),
  128.                        (BOOL) SendMessage (LOWORD (lParam),
  129.                                              WM_GETTEXTLENGTH, 0, 0L)) ;
  130.                  break ;
  131.  
  132.               case IDOK:
  133.                  GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80) ;
  134.  
  135.                  nEditLen  = strlen (szFileName) ;
  136.                  cLastChar = *AnsiPrev (szFileName, szFileName + nEditLen) ;
  137.                
  138.                  if (cLastChar == '\\' || cLastChar == ':')
  139.                     strcat (szFileName, szFileSpec) ;
  140.  
  141.                  if (nstrchr (szFileName, '*') || nstrchr (szFileName, '?'))
  142.                     {
  143.                     if (DlgDirList (hDlg, szFileName, IDD_FLIST,
  144.                                                   IDD_FPATH, wFileAttr))
  145.                        {
  146.                        strcpy (szFileSpec, szFileName) ;
  147.                        SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  148.                        }
  149.                     else
  150.                        MessageBeep (0) ;               
  151.                     break ;
  152.                     }
  153.  
  154.                  strcat (strcat (szFileName, "\\"), szFileSpec) ;
  155.  
  156.                  if (DlgDirList (hDlg, szFileName, IDD_FLIST,
  157.                                                   IDD_FPATH, wFileAttr))
  158.                     {
  159.                     strcpy (szFileSpec, szFileName) ;
  160.                     SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  161.                     break ;
  162.                     }
  163.  
  164.                  szFileName [nEditLen] = '\0' ;
  165.  
  166.                  if (-1 == OpenFile (szFileName, pof, OF_READ | OF_EXIST))
  167.                     {
  168.                     strcat (szFileName, szDefExt) ;
  169.                     if (-1 == OpenFile (szFileName, pof, OF_READ | OF_EXIST))
  170.                        {
  171.                        MessageBeep (0) ;
  172.                        break ;
  173.                        }
  174.                     }
  175.                     strcpy (szFileName,
  176.                          (PSTR) AnsiNext (nstrrchr (pof->szPathName, '\\'))) ;
  177.                  
  178.                  OemToAnsi (szFileName, szFileName) ;
  179.                  EndDialog (hDlg, TRUE) ;
  180.                  break ;
  181.  
  182.               case IDCANCEL:
  183.                  EndDialog (hDlg, FALSE) ;
  184.                  break ;
  185.  
  186.               default:
  187.                  return FALSE ;
  188.               }
  189.         default:
  190.            return FALSE ;            
  191.         }
  192.      return TRUE ;
  193.      }
  194.  
  195. BOOL FAR PASCAL FileSaveDlgProc (hDlg, iMessage, wParam, lParam)
  196.      HWND      hDlg ;
  197.      unsigned  iMessage ;
  198.      WORD      wParam ;
  199.      LONG      lParam ;
  200.      {
  201.      switch (iMessage)
  202.         {
  203.         case WM_INITDIALOG:
  204.            SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L) ;
  205.            DlgDirList (hDlg, szFileSpec, 0, IDD_FPATH, 0) ;
  206.            SetDlgItemText (hDlg, IDD_FNAME, szFileSpec) ;
  207.            return TRUE ;
  208.  
  209.         case WM_COMMAND:
  210.  
  211.            switch (wParam)
  212.               {
  213.               case IDD_FNAME:
  214.                  if (HIWORD (lParam) == EN_CHANGE)
  215.                     EnableWindow (GetDlgItem (hDlg, IDOK),
  216.                        (BOOL) SendMessage (LOWORD (lParam),
  217.                                              WM_GETTEXTLENGTH, 0, 0L)) ;
  218.                  break ;
  219.  
  220.               case IDOK:
  221.                  GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80) ;
  222.  
  223.                  if (-1 == OpenFile (szFileName, pof, OF_PARSE))
  224.                     {
  225.                     MessageBeep (0) ;
  226.                     break ;
  227.                     }
  228.  
  229.                  if (!nstrchr ((PSTR) AnsiNext
  230.                                    (nstrrchr (pof->szPathName, '\\')), '.'))
  231.                     strcat (szFileName, szDefExt) ;
  232.  
  233.                  if (-1 != OpenFile (szFileName, pof, OF_WRITE | OF_EXIST))
  234.                     wStatus = 1 ;
  235.  
  236.                  else if (-1 != OpenFile (szFileName, pof,
  237.                                                   OF_CREATE | OF_EXIST))
  238.                     wStatus = 0 ;
  239.  
  240.                  else
  241.                     {
  242.                     MessageBeep (0) ;
  243.                     break ;
  244.                     }
  245.  
  246.                     strcpy (szFileName, 
  247.                          (PSTR) AnsiNext (nstrrchr (pof->szPathName, '\\'))) ;
  248.  
  249.                  OemToAnsi (szFileName, szFileName) ;
  250.                  EndDialog (hDlg, TRUE) ;
  251.                  break ;
  252.  
  253.               case IDCANCEL:
  254.                  EndDialog (hDlg, FALSE) ;
  255.                  break ;
  256.  
  257.               default:
  258.                  return FALSE ;
  259.               }
  260.         default:
  261.            return FALSE ;            
  262.         }
  263.      return TRUE ;
  264.      }
  265.  
  266. static char *nstrchr (str, ch)
  267.      char *str ;
  268.      int  ch ;
  269.      {
  270.      while (*str)
  271.           {
  272.           if (ch == *str)
  273.                return str ;
  274.           str = (PSTR) AnsiNext (str) ;
  275.           }
  276.      return NULL ;
  277.      }
  278.  
  279. static char *nstrrchr (str, ch)
  280.      char *str ;
  281.      int  ch ;
  282.      {
  283.      char *strl = str + strlen (str) ;
  284.  
  285.      do
  286.           {
  287.           if (ch == *strl)
  288.                return strl ;
  289.           strl = (PSTR) AnsiPrev (str, strl) ;
  290.           }
  291.      while (strl > str) ;
  292.  
  293.      return NULL ;
  294.      }
  295.